const express = require('express');
const session = require('express-session');
const MemoryStore = require('memorystore')(session); // 使用内存存储会话

const app = express();

// 配置会话
const store = new MemoryStore({
    checkPeriod: 86400000 // 清理过期会话的时间间隔
});

// 配置会话
app.use(session({
    secret: '7b09c869cf04011d6af56827bf1d916890f30caf52ff631113bfeb8c5d129b459ec258e1a6642d640e7725d0282305c8fc941bdca15d2e719f6bdc938de232e3',
    resave: false,  // 只有会话修改了，才保存会话
    saveUninitialized: false,  // 即使会话初始化后，才保存会话
    cookie: {
        maxAge: 3600000 // 会话有效期为 1 小时
    },
    store: store
}));

// 存储会话信息的对象
const sessionStorage = {};

// 生成一个会话 ID 供黑客使用
app.get('/generateId', (req, res) => {
    req.session.isLoggedIn = false;
    sessionStorage[req.session.id] = req.session; // 括号类是属性，右边是值
    res.send(`可用于攻击的会话 ID: ${req.session.id}`);
});

// 登录接口
app.get('/login', (req, res) => {
    // 校验用户的账号密码是否正确
    // 将用户信息保存到会话中
    // 拿到登录地址的url中的sessionID参数，找到对应的session
    const sessionId = req.query.sessionID;
    if (sessionId) {
        // 模拟用户使用攻击者提供的会话 ID 登录
        const storedSession = sessionStorage[sessionId];
        // 从sessionStorage中取出session，如果取到了，就登录成功
        if (storedSession) {
            req.session = storedSession;
            req.session.isLoggedIn = true;
            sessionStorage[sessionId] = req.session;
            res.send(`登录成功！用户的sessionID为：${sessionId}`);
            return;
        }
    }
    res.send('登录失败！');
});

// 转账接口
app.get('/transfer', (req, res) => {
    console.log(`当前用户的sessionID为：${req.session.id}`);
    if (req.session.isLoggedIn) {
        res.send('转账成功！');
    } else {
        res.send('您还未登录，请先登录');
    }
});

// 启动服务器
const port = 3000;
app.listen(port, () => {
    console.log(`服务器运行在 http://localhost:${port}`);
});

